文件路径

import path from 'node:path';

const notes = '/users/joe/notes.txt';

path.dirname(notes); // /users/joe
path.basename(notes); // notes.txt
path.extname(notes); // .txt

// 可以通过指定 basename 的第二个参数来获取不带扩展名的文件名
path.basename(notes, path.extname(notes)); // notes
const name = 'joe';
path.join('/', 'users', name, './notes.txt'); // '/users/joe/notes.txt'

path.resolve('joe.txt'); // '/Users/joe/joe.txt'
// 没有绝对路径,则绝对路径为当前工作目录

path.resolve('/etc', 'joe.txt'); // '/etc/joe.txt'
// 有绝对路径,就用提供的绝对路径

path.normalize('/users/joe/..//test.txt'); // '/users/test.txt'

注意:上面的方法都不会检查路径是否存在,它们只是根据获得的信息计算出一条路径

文件信息

异步回调:

import fs from 'node:fs';

fs.stat('/Users/joe/test.txt', (err, stats) => {
  if (err) {
    console.error(err);
  }
  // we have access to the file stats in `stats`
});

同步阻塞:

import fs from 'node:fs';

try {
  const stats = fs.statSync('/Users/joe/test.txt');
} catch (err) {
  console.error(err);
}

异步 Promise:

import fs from 'node:fs/promises';

try {
  const stats = await fs.stat('/Users/joe/test.txt');
} catch (err) {
  console.log(err);
}

文件描述符

在与文件系统中的文件进行交互之前,必须获取文件描述符

文件描述符是对打开文件的引用,是使用 fs 模块提供的 open() 方法打开文件返回的数字。该数字(fd)唯一标识操作系统中打开的文件

import fs from 'node:fs';

fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
  // fd is our file descriptor
});

第二个参数是一个标记,经常使用的标记:

读取文件

import fs from 'node:fs';

fs.readFile('/Users/joe/test.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

一次性读取文件的完整内容到内存,这意味着大文件将对内存消耗和程序执行速度产生重大影响。在这种情况下,更好的选择是使用流读取文件内容:

写入文件

import fs from 'node:fs';

const content = 'Some content!';

fs.writeFile('/Users/joe/test.txt', content, err => {
  if (err) {
    console.error(err);
  } else {
    // file written successfully
  }
});

默认情况下,如果文件已存在,此 API 将替换该文件的内容,可以通过指定标志来修改写入模式:

fs.writeFile('/Users/joe/test.txt', content, { flag: 'a+' }, err => {});

或者直接调用 appendFile 函数进行追加:

import fs from 'node:fs';

const content = 'Some content!';

fs.appendFile('file.log', content, err => {
  if (err) {
    console.error(err);
  } else {
    // done!
  }
});

处理文件夹